#include "stm32f10x.h"                  // Device header
#include "servo.h"
#include "LED.h"
/**
  * 函    数：定时中断初始化
  * 参    数：无
  * 返 回 值：无
  */

void TIM2_init(u16 arr, u16 psc)
{
	TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
	NVIC_InitTypeDef NVIC_InitStructure;

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // 时钟 TIM2 使能
	// 定时器 TIM2 初始化
	TIM_TimeBaseStructure.TIM_Period = arr;						// 设置自动重装载寄存器周期的值
	TIM_TimeBaseStructure.TIM_Prescaler = psc;					// 设置时钟频率除数的预分频值
	TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;		// 输入捕获分频：不分频
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // TIM 向上计数
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);				// ②初始化 TIM2
	TIM_ARRPreloadConfig(TIM2, DISABLE);
	TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); // ③允许更新中断

	// 中断优先级 NVIC 设置
	NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;			  // TIM2 中断
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 先占优先级 0 级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;		  // 从优先级 2 级
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			  // IRQ 通道被使能
	NVIC_Init(&NVIC_InitStructure);							  // ④初始化 NVIC 寄存器
	TIM_Cmd(TIM2, ENABLE);									  // ⑤使能 TIM2
}


void TIM2_IRQHandler(void)
{
    static u8 flag = 0;
    static u8 duoji_index1 = 0;
    int temp;
	
	  if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) // 检查 TIM2 更新中断发生与否
    {
        TIM_ClearITPendingBit(TIM2, TIM_IT_Update); // 清除 TIM2 更新中断标志
			
			  // 通过改变重装载值和舵机下标索引，每个舵机定时2500（2.5ms），执行8个舵机后完成一个周期20000（20ms） 
			  if (duoji_index1 == 8)
        {
            duoji_index1 = 0;
        }
				
				
        // 如果是3号或4号舵机，将它们的cur值取反
        if (duoji_index1 == 3 || duoji_index1 == 4)
        {
            temp = 3000 - (unsigned int)(duoji_doing[duoji_index1].cur);  // 反向处理
        }
        else
        {
            temp = (unsigned int)(duoji_doing[duoji_index1].cur);  // 正常处理
        }
				
				
				//利用flag进行设置对应电机引脚
	      if (flag == 0)
        {
            TIM2->ARR = temp;  // 设置定时器重装载值
            servo_pin_set(duoji_index1, Bit_SET);  // 使能舵机
            servo_inc_offset(duoji_index1);  // 调整舵机位置
        }
        else
        {
            TIM2->ARR = 2500 - temp;  // 设置剩余的周期时间
            servo_pin_set(duoji_index1, Bit_RESET);  // 关闭舵机
            duoji_index1++;  // 下一个舵机
				}                                                            //通过arr不断改变中断周期，八个舵机（实际用到6个）加起来是20ms，
				                                                             //但是实际上已经进入了中断服务函数8*2=16次了
		
		}
	
	flag = !flag;  // 切换状态
}

